//package com.moyun.websocket.config;
//
//import com.moyun.websocket.interceptor.WebSocketChannelInterceptor;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.messaging.converter.MessageConverter;
//import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
//import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
//import org.springframework.messaging.simp.config.ChannelRegistration;
//import org.springframework.messaging.simp.config.MessageBrokerRegistry;
//import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
//import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
//import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
//import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
//import org.springframework.web.socket.server.standard.ServerEndpointExporter;
//import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
//
//import java.util.List;
//
///**
// * <配置基于STOMP的websocket>
// */
//@Configuration
//// 此注解表示使用STOMP协议来传输基于消息代理的消息，此时可以在@Controller类中使用@MessageMapping
//@EnableWebSocketMessageBroker
//public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
//
//    /**
//     * 注册 Stomp的端点 该registerStompEndpoints()方法注册/ws端点，启用 SockJS 回退选项，以便在 WebSocket 不可用时使用备用传输。SockJS 客户端将尝试连接/ws并使用最佳可用传输
//     * addEndpoint：添加STOMP协议的端点。这个HTTP URL是供WebSocket或SockJS客户端访问的地址
//     * withSockJS：指定端点使用SockJS协议
//     */
//    /**
//     * 1. 将 /ws路径注册为STOMP的端点，
//     * 用户连接了这个端点后就可以进行websocket通讯，支持socketJs
//     * 2. setAllowedOrigins("*")表示可以跨域
//     * 3. withSockJS()表示支持socktJS访问
//     * 4. addInterceptors 添加自定义拦截器，这个拦截器是上一个demo自己定义的获取httpsession的拦截器
//     * 5. addInterceptors 添加拦截处理，这里MyPrincipalHandshakeHandler 封装的认证用户信息
//     */
//    @Override
//    public void registerStompEndpoints(StompEndpointRegistry registry) {
//        registry.addEndpoint("/ws")
//                // 添加允许跨域访问
//                .setAllowedOrigins("*")
//                .addInterceptors(new HttpSessionHandshakeInterceptor())
//                .withSockJS();// 指定/ws 端点 使用的是SockJS协议 端点
//    }
//
//    @Bean
//    public ServerEndpointExporter serverEndpointExporter() {
//        return new ServerEndpointExporter();
//    }
//
//    /**
//     * 配置信息代理,配置消息代理，哪种路径的消息会进行代理处理
//     * 该configureMessageBroker()方法实现了WebSocketMessageBrokerConfigurer配置消息代理的默认方法。
//     * 它首先调用enableSimpleBroker()以启用一个简单的基于内存的消息代理，以将问候消息传送回以 为前缀的目标上的客户端/topic
//     * 它还/app为绑定到用 注释的方法的消息指定前缀@MessageMapping。此前缀将用于定义所有消息映射。例如，/app/hello是GreetingController.greeting()方法映射到处理的端点。
//     * 配置消息代理
//     * 启动简单Broker，消息的发送的地址符合配置的前缀来的消息才发送到这个broker
//     */
//    @Override
//    public void configureMessageBroker(MessageBrokerRegistry registry) {
//        // 点对点使用的订阅前缀（客户端订阅路径上会体现出来），不设置的话，默认也是/user/
//        registry.setUserDestinationPrefix("/user/");
//
//        /*
//         * spring 内置broker对象
//         * 1. 配置代理域，可以配置多个，此段代码配置去代理 目的地的前缀为 /topicTest 或者 /userTest
//         *    我们就可以在配置的域上向客户端推送消息
//         * 2，进行心跳设置，第一值表示server最小能保证发的心跳间隔毫秒数, 第二个值代码server希望client发的心跳间隔毫秒数
//         * 3. 可以配置心跳线程调度器 setHeartbeatValue这个不能单独设置，不然不起作用，要配合setTaskScheduler才可以生效
//         *    调度器我们可以自己写一个，也可以自己使用默认的调度器 new DefaultManagedTaskScheduler()
//         */
//        registry.enableSimpleBroker("/topic", "/queue");
//                /*.setHeartbeatValue(new long[]{
//                        10000,10000})
//                .setTaskScheduler(taskScheduler);*/
//
//        /*
//         *  全局使用的消息前缀（客户端订阅路径上会体现出来）
//         *  "/app" 为配置应用服务器的地址前缀，表示所有以/app 开头的客户端消息或请求
//         *  都会路由到带有@MessageMapping 注解的方法中
//         */
//        registry.setApplicationDestinationPrefixes("/app");
//
//        /*
//         *  1. 配置一对一消息前缀， 客户端接收一对一消息需要配置的前缀 如“'/user/'+userid + '/message'”，
//         *     是客户端订阅一对一消息的地址 stompClient.subscribe js方法调用的地址
//         *  2. 使用@SendToUser发送私信的规则不是这个参数设定，在框架内部是用UserDestinationMessageHandler处理，
//         *     而不是 AnnotationMethodMessageHandler 或  SimpleBrokerMessageHandler
//         *     or StompBrokerRelayMessageHandler，是在@SendToUser的URL前加“user+sessionId"组成
//         */
//        registry.setUserDestinationPrefix("/user");
//
//        /*
//         * 自定义路径分割符
//         * 注释掉的这段代码添加的分割符为. 分割是类级别的@messageMapping和方法级别的@messageMapping的路径
//         * 例如类注解路径为 “topic”,方法注解路径为“hello”，那么客户端JS stompClient.send 方法调用的路径为“/app/topic.hello”
//         * 注释掉此段代码后，类注解路径“/topic”,方法注解路径“/hello”,JS调用的路径为“/app/topic/hello”
//         */
//        //registry.setPathMatcher(new AntPathMatcher("."));
//    }
//
//    /**
//     * 配置发送与接收的消息参数，可以指定消息字节大小，缓存大小，发送超时时间
//     *
//     * @param registration
//     */
////    @Override
////    public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
////
////        /*
////         * 1. setMessageSizeLimit 设置消息缓存的字节数大小 字节
////         * 2. setSendBufferSizeLimit 设置websocket会话时，缓存的大小 字节
////         * 3. setSendTimeLimit 设置消息发送会话超时时间，毫秒
////         */
////        registration.setMessageSizeLimit(10240)
////                .setSendBufferSizeLimit(10240)
////                .setSendTimeLimit(10000);
////    }
////
////    /**
////     * 设置输入消息通道的线程数，默认线程为1，可以自己自定义线程数，最大线程数，线程存活时间
////     *
////     * @param registration
////     */
////    @Override
////    public void configureClientInboundChannel(ChannelRegistration registration) {
////
////
////        /*
////         * 配置消息线程池
////         * 1. corePoolSize 配置核心线程池，当线程数小于此配置时，不管线程中有无空闲的线程，都会产生新线程处理任务
////         * 2. maxPoolSize 配置线程池最大数，当线程池数等于此配置时，不会产生新线程
////         * 3. keepAliveSeconds 线程池维护线程所允许的空闲时间，单位秒
////         */
////        registration.taskExecutor().corePoolSize(10)
////                .maxPoolSize(20)
////                .keepAliveSeconds(60);
////        /*
////         * 添加stomp自定义拦截器，可以根据业务做一些处理
////         * springframework 4.3.12 之后版本此方法废弃，代替方法 interceptors(ChannelInterceptor... interceptors)
////         * 消息拦截器，实现ChannelInterceptor接口
////         */
////        registration.setInterceptors(webSocketChannelInterceptor());
////    }
////
////    /**
////     * 设置输出消息通道的线程数，默认线程为1，可以自己自定义线程数，最大线程数，线程存活时间
////     *
////     * @param registration
////     */
////    @Override
////    public void configureClientOutboundChannel(ChannelRegistration registration) {
////
////        registration.taskExecutor().corePoolSize(10)
////                .maxPoolSize(20)
////                .keepAliveSeconds(60);
////        //registration.setInterceptors(new WebSocketChannelInterceptor());
////    }
////
////    /**
////     * 添加自定义的消息转换器，spring 提供多种默认的消息转换器，
////     * 返回false,不会添加消息转换器，返回true，会添加默认的消息转换器，当然也可以把自己写的消息转换器添加到转换链中
////     *
////     * @param list
////     * @return
////     */
////    @Override
////    public boolean configureMessageConverters(List<MessageConverter> list) {
////        return true;
////    }
////
////    /**
////     * 自定义控制器方法的参数类型，有兴趣可以百度google HandlerMethodArgumentResolver这个的用法
////     *
////     * @param list
////     */
////    @Override
////    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> list) {
////
////    }
////
////    /**
////     * 自定义控制器方法返回值类型，有兴趣可以百度google HandlerMethodReturnValueHandler这个的用法
////     *
////     * @param list
////     */
////    @Override
////    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> list) {
////
////    }
////
////    /**
////     * 拦截器加入 spring ioc容器
////     *
////     * @return
////     */
////    @Bean
////    public WebSocketChannelInterceptor webSocketChannelInterceptor() {
////        return new WebSocketChannelInterceptor();
////    }
//
//
//}
